package com.fy.util;

import java.sql.*;

/**
 * 数据库工具类
 * @author 小叶
 * @version 3.0
 */
public class DbUtil {
	/*
	 * JDBC连接DB2
	 * private String className="com.ibm.db2.jdbc.net.DB2Driver";
	 * private String url="jdbc:db2://localhost:8080/db2";
	 * JDBC连接Microsoft SQLServer(sqljdbc.jar/sqljdbc4.jar)
	 * private String className="com.microsoft.jdbc.sqlserver.SQLServerDriver";
	 * private String url="jdbc:microsoft:sqlserver://localhost:1433;
	 * SelectMethod=Cursor;dataBaseName=sqlserver";
	 * JDBC连接Sybase(jconn2.jar)
	 * private String className="com.sybase.jdbc2.jdbc.SybDriver";
	 * private String url="jdbc:sybase:Tds:localhost:2638";
	 * JDBC连接MySQL(mysql-connector-java-5.1.39-bin.jar)
	 * private String className="com.mysql.jdbc.Driver";
	 * private String url="jdbc:mysql://localhost:3306/mysql";
	 * JDBC连接PostgreSQL(pgjdbc2.jar)
	 * private String className="org.postgresql.Driver";
	 * private String url="jdbc:postgresql://localhost/pg";
	 * JDBC连接Oracle(classes12.jar/ojdbc14.jar/ojdbc5.jar/ojdbc6.jar)
	 * private String className="oracle.jdbc.driver.OracleDriver";
	 * private String url="jdbc:oracle:thin:@localhost:1521:orcl";
	 */
	private Connection conn = null;
	private String className = "oracle.jdbc.driver.OracleDriver";// 用oracle.jdbc.OracleDriver也行
	private String mode = "thin";// 连接模式
	private String fullIP = "";// 全IP（IP地址+端口号）
	private String ip = "127.0.0.1";// 机器名或IP地址
	private String port = "1521";// 端口号
	private String instance = "orcl";// 实例名
	private String user = "scott";// 用户名
	private String password = "tiger";// 密码
	/**
	 * 本地连接数据库（构造方法）（默认为orcl实例下的scott用户）
	 * @return Connection
	 */
	private DbUtil() {
		try {
			Class.forName(this.className);
			conn = DriverManager.getConnection("jdbc:oracle:" + mode + ":@" + ip + ":" + port + ":" + instance, user,
					password);// 获取连接字符串
			System.out.println("连接数据库成功");
		} catch (ClassNotFoundException e) {
			System.err.println("加载驱动失败");
			e.printStackTrace();
		} catch (SQLException e) {
			System.err.println("连接数据库失败");
			e.printStackTrace();
		}
	}
	/**
	 * 远程连接数据库（构造方法）
	 * @param mode			连接模式
	 * @param ip				机器名或IP地址
	 * @param port			端口号
	 * @param instance		实例名
	 * @param user			用户名
	 * @param password	密码
	 * @return Connection
	 */
	private DbUtil(String mode, String ip, String port, String instance, String user, String password) {
		this.mode = mode;
		this.ip = ip;
		this.port = port;
		this.instance = instance;
		this.user = user;
		this.password = password;
		try {
			Class.forName(this.className);
			if (ip != "" && port != "")
				fullIP = ip + ":" + port + ":";// 第二个":"用"/"也行
			conn = DriverManager.getConnection("jdbc:oracle:" + mode + ":@" + fullIP + instance, user, password);// 获取连接字符串
			System.out.println("连接数据库成功");
		} catch (ClassNotFoundException e) {
			System.err.println("连接数据库失败");
			e.printStackTrace();
		} catch (SQLException e) {
			System.err.println("连接数据库失败");
			e.printStackTrace();
		}
	}
	/**
	 * 本地连接数据库（默认为orcl实例的scott用户）
	 * @return Connection
	 */
	public static Connection getConn() {
		DbUtil db = new DbUtil();
		return db.conn;
	}
	/**
	 * 远程连接数据库
	 * @param mode			连接模式
	 * @param ip				机器名或IP地址
	 * @param port			端口号
	 * @param instance		实例名
	 * @param user			用户名
	 * @param password	密码
	 * @return Connection
	 */
	public static Connection getConn(String mode, String ip, String port, String instance, String user, String password) {
		DbUtil db = new DbUtil(mode, ip, port, instance, user, password);
		return db.conn;
	}
	/**
	 * 我的数据库连接
	 * @return Connection
	 */
	public static Connection getMyConn() {
		return getConn();
		// return getConn("thin", "localhost", "1521", "yqr", "yequanrui", "sherlock");
	}
	/**
	 * 用thin方式连接（服务器端）
	 * @param ip				机器名或IP地址
	 * @param port			端口号
	 * @param instance		实例名
	 * @param user			用户名
	 * @param password	密码
	 * @return Connection
	 */
	public static Connection getThinConn(String ip, String port, String instance, String username, String password) {
		return getConn("thin", ip, port, instance, username, password);
	}
	/**
	 * 用oci方式连接（客户端）
	 * @param instance		实例名
	 * @param user			用户名
	 * @param password	密码
	 * @return Connection
	 */
	public static Connection getOciConn(String instance, String username, String password) {
		return getConn("oci", "", "", instance, username, password);
	}
	/**
	 * 关闭数据库
	 * @param conn
	 * @param state
	 * @param rs
	 */
	public static void close(Connection conn, Statement state, ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
			if (state != null)
				state.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}